/**
 * @desc 添加动态路由
 * @param menuStore 动态路由数组
 * @param router VueRouter路由对象
 */
export const addRoutes = (
  menuStore: any,
  router: any,
  userStore: any,
  tag: Boolean
) => {
  if (userStore.routerList && userStore.routerList.length > 0) {
    //首先判断传入的 store中是否时存在数据的，一般在获取数据时就会判断数据是否正确，且pinia增加持久化，故此地也可不要if判断
    const routesData = JSON.parse(JSON.stringify(userStore.routerList));
    //深拷贝数据，慎用，上线之后项目会报错，大致是因为循坏加载constructor
    const views = import.meta.glob("./views/**/*.vue");
    //vue3 新写法，目的是为了后续处理数据中的组件引入路径
    recursiveRoutes(routesData, views);
    // 首次登录，默认重定向某个路由
    if (tag) {
      const baseRoute = router.getRoutes();
      const data = routesData[0];
      for (let i = 0; i < baseRoute.length; i++) {
        const element = baseRoute[i];
        if (element.name == "Layout") {
          const firstRouter = data.children ? data.children[0].name : data.name;
          element.redirect = firstRouter;
          menuStore.setSelectedMenu(firstRouter);
        }
      }
    }
    // 动态路由
    routesData.forEach((item: any) => {
      //路由数据解析完成，开始添加到本地路由表中
      router.addRoute("Layout", item);
    });
    // 菜单初始化管理
    menuStore.generateMenus(routesData);

    const data = router.options.routes;
    for (let i = 0; i < data.length; i++) {
      const element = data[i];
      if (element.name == "Layout") {
        element.redirect = { name: routesData[0].name };
      }
    }
    // TODO：临时解决路由重定向无效
    // setTimeout(() => {
    //   router.replace("/dashboard");
    // }, 2);
  }
  //在所有的路由动态添加完毕后，需再次添加404页面，注意vue3新写法
  router.addRoute({
    path: "/:pathMatch(.*)*",
    name: "404",
    component: () => import("@/components/NotFound.vue"),
    meta: {
      title: "404",
      layout: false,
    },
  });
};
// 递归遍历路由数据
export const recursiveRoutes = (tree: any[], views: any) => {
  return tree.map((node) => {
    const tempNode = node;
    if (tempNode.component) {
      // 修改每一个路由的组件引入路径
      tempNode.component = views[`./views/${tempNode.component}.vue`];
    }
    if (tempNode.children && tempNode.children.length > 0) {
      // 存在嵌套路由时，递归调用该函数处理
      recursiveRoutes(tempNode.children, views);
    }
    return tempNode;
  });
};
// 清除动态路由
// getRoutes()：获取一个包含所有路由记录的数组
// hasRoute()：检查路由是否存在
export const clearRoutes = (menuStore: any, router: any, userStore: any) => {
  if (menuStore.menus && menuStore.menus.length > 0) {
    menuStore.menus.forEach((item: any) => {
      router.removeRoute(item.name);
    });
    //直接调用user tore中定义好的action函数
    menuStore.clearMenus();
    userStore.clearRouterList();
  }
};
